/**
 * Copyright 2018 人人开源 http://www.renren.io
 * <p>
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * <p>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p>
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.qintian.rainstorm.util;

import org.apache.commons.lang.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * 日期处理
 * 

 */
public class DateUtils {
	/** 时间格式(yyyy-MM-dd) */
	public final static String DATE_PATTERN = "yyyy-MM-dd";
	/** 时间格式(yyyy-MM-dd HH:mm:ss) */
	public final static String DATE_TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    /** 时间格式(yyMMddHH) */
    public final static String DATE_TIME_PATTERN_1 = "yyMMddHH";
    /** 时间格式(yyMMddHHmm) */
    public final static String DATE_TIME_PATTERN_2 = "yyMMddHHmm";
    /** 时间格式(yyyyMM) */
    public final static String DATE_TIME_PATTERN_3 = "yyyyMM";
    /** 时间格式(yyyy-MM-dd HH:mm) */
    public final static String DATE_TIME_PATTERN_4 = "yyyy-MM-dd HH:mm";
    public final static String DATE_TIME_PATTERN_5 = "yyyyMMddHHmm";
    public final static String DATE_TIME_PATTERN_6 = "yyyyMMdd";

    private static Calendar calendarUtil;

    /**
     * 未传入时间 则 返回当前年数、月数、日、时、分、秒；否则 ，反之。
     * @param cal
     * @return 返回年数
     */
    public static Map<String,Integer> getYearNumber(Calendar cal) {
        calendarUtil = Calendar.getInstance();
        Map<String, Integer> map = new HashMap<>();
        if (cal == null) {
            //年
            map.put("year", calendarUtil.get(Calendar.YEAR));
            //月
            map.put("month", calendarUtil.get(Calendar.MONTH) + 1);
            //日
            map.put("day", calendarUtil.get(Calendar.DAY_OF_MONTH));
            //时
            map.put("hour", calendarUtil.get(Calendar.HOUR_OF_DAY));
            //分
            map.put("minute", calendarUtil.get(Calendar.MINUTE));
            //秒
            map.put("second", calendarUtil.get(Calendar.SECOND));
            return map;
        } else {
            //年
            map.put("year", cal.get(Calendar.YEAR));
            //月
            map.put("month", cal.get(Calendar.MONTH) + 1);
            //日
            map.put("day", cal.get(Calendar.DAY_OF_MONTH));
            //时
            map.put("hour", cal.get(Calendar.HOUR_OF_DAY));
            //分
            map.put("minute", cal.get(Calendar.MINUTE));
            //秒
            map.put("second", cal.get(Calendar.SECOND));
            return map;
        }
    }

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     * @param date  日期
     * @return  返回yyyy-MM-dd格式日期
     */
	public static String format(Date date) {
        return format(date, DATE_PATTERN);
    }


    /**
     * 获取前一个月的最后一天 日期
     * @param date yyMMddHH
     * @return
     */
    public static String getLastDayOfNextMoney(Date date) {
        calendarUtil = Calendar.getInstance();
        calendarUtil.setTime(date);
        calendarUtil.set(Calendar.DAY_OF_MONTH, 1);
        calendarUtil.add(Calendar.DATE, -1);
        return format(calendarUtil.getTime(), DATE_TIME_PATTERN_1);
    }

    /**
     * 判断该日期是否是该月的最后一天
     *
     * @param date
     *            需要判断的日期
     * @return
     */
    public static boolean isLastDayOfMonth(Date date) {
        calendarUtil = Calendar.getInstance();
        if(date != null){
            calendarUtil.setTime(date);
        }
        return calendarUtil.get(Calendar.DAY_OF_MONTH) == calendarUtil
                .getActualMaximum(Calendar.DAY_OF_MONTH);
    }

    /**
     * 日期格式化 日期格式为：yyyy-MM-dd
     * @param date  日期
     * @param pattern  格式，如：DateUtils.DATE_TIME_PATTERN
     * @return  返回yyyy-MM-dd格式日期
     */
    public static String format(Date date, String pattern) {
        if(date != null){
            SimpleDateFormat df = new SimpleDateFormat(pattern);
            return df.format(date);
        }
        return null;
    }

    /**
     * 字符串转换成日期
     * @param strDate 日期字符串
     * @param pattern 日期的格式，如：DateUtils.DATE_TIME_PATTERN
     */
    public static Date stringToDate(String strDate, String pattern) {
        if (StringUtils.isBlank(strDate)){
            return null;
        }

        DateTimeFormatter fmt = DateTimeFormat.forPattern(pattern);
        return fmt.parseLocalDateTime(strDate).toDate();
    }

    /**
     * 根据周数，获取开始日期、结束日期
     * @param week  周期  0本周，-1上周，-2上上周，1下周，2下下周
     * @return  返回date[0]开始日期、date[1]结束日期
     */
    public static Date[] getWeekStartAndEnd(int week) {
        DateTime dateTime = new DateTime();
        LocalDate date = new LocalDate(dateTime.plusWeeks(week));

        date = date.dayOfWeek().withMinimumValue();
        Date beginDate = date.toDate();
        Date endDate = date.plusDays(6).toDate();
        return new Date[]{beginDate, endDate};
    }

    /**
     * 对日期的【秒】进行加/减
     *
     * @param date 日期
     * @param seconds 秒数，负数为减
     * @return 加/减几秒后的日期
     */
    public static Date addDateSeconds(Date date, int seconds) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusSeconds(seconds).toDate();
    }

    /**
     * 对日期的【分钟】进行加/减
     *
     * @param date 日期
     * @param minutes 分钟数，负数为减
     * @return 加/减几分钟后的日期
     */
    public static Date addDateMinutes(Date date, int minutes) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMinutes(minutes).toDate();
    }

    /**
     * 对日期的【小时】进行加/减
     *
     * @param date 日期
     * @param hours 小时数，负数为减
     * @return 加/减几小时后的日期
     */
    public static Date addDateHours(Date date, int hours) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusHours(hours).toDate();
    }

    /**
     * 对日期的【天】进行加/减
     *
     * @param date 日期
     * @param days 天数，负数为减
     * @return 加/减几天后的日期
     */
    public static Date addDateDays(Date date, int days) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusDays(days).toDate();
    }

    /**
     * 对日期的【周】进行加/减
     *
     * @param date 日期
     * @param weeks 周数，负数为减
     * @return 加/减几周后的日期
     */
    public static Date addDateWeeks(Date date, int weeks) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusWeeks(weeks).toDate();
    }

    /**
     * 对日期的【月】进行加/减
     *
     * @param date 日期
     * @param months 月数，负数为减
     * @return 加/减几月后的日期
     */
    public static Date addDateMonths(Date date, int months) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusMonths(months).toDate();
    }

    /**
     * 对日期的【年】进行加/减
     *
     * @param date 日期
     * @param years 年数，负数为减
     * @return 加/减几年后的日期
     */
    public static Date addDateYears(Date date, int years) {
        DateTime dateTime = new DateTime(date);
        return dateTime.plusYears(years).toDate();
    }

}
